[XEN][POWERPC] Generalized parallel IPI handlers
authorJimi Xenidis <jimix@watson.ibm.com>
Tue, 28 Nov 2006 21:56:40 +0000 (16:56 -0500)
committerJimi Xenidis <jimix@watson.ibm.com>
Tue, 28 Nov 2006 21:56:40 +0000 (16:56 -0500)
Our problem with x86 do_IRQ is that it does not respect IRQ_PER_CPU, so
make our logic reflect that generically.  We remove the spin lock in
this case, since the programming convention is to update irq descs
atomically (if at all).  This patch allows read_clocks to work properly.
Signed-off-by: Amos Waterland <apw@us.ibm.com>
Signed-off-by: Jimi Xenidis <jimix@watson.ibm.com>
Signed-off-by: Hollis Blanchard <hollisb@us.ibm.com>
--HG--
extra : transplant_source : %1E%1Ac%40%81%29%BE%A2%D8%7FH%5CR%F1%BE%21%AD%A3_%F0

xen/arch/powerpc/external.c
xen/arch/powerpc/mpic_init.c
xen/include/asm-powerpc/smp.h

index 5801efb51a41dce5f809adb00861d34712ed3102..59d0904bf1d32a47983a373e878fc5e8a3e4d407 100644 (file)
@@ -82,15 +82,13 @@ void do_external(struct cpu_user_regs *regs)
 
     vec = xen_mpic_get_irq(regs);
 
-    if (vector_is_ipi(vec)) {
-        /* do_IRQ is fundamentally broken for reliable IPI delivery.  */
+    if (irq_desc[vec].status & IRQ_PER_CPU) {
+       /* x86 do_IRQ does not respect the per cpu flag.  */
         irq_desc_t *desc = &irq_desc[vec];
         regs->entry_vector = vec;
-        spin_lock(&desc->lock);
         desc->handler->ack(vec);
         desc->action->handler(vector_to_irq(vec), desc->action->dev_id, regs);
         desc->handler->end(vec);
-        spin_unlock(&desc->lock);
     } else if (vec != -1) {
         DBG("EE:0x%lx isrc: %d\n", regs->msr, vec);
         regs->entry_vector = vec;
index 5d5187a80a14589fb6fc0105ca5e01223eb4899b..bda732bb2525c075ad1bbdd48e393b2835aaf0cf 100644 (file)
@@ -448,9 +448,3 @@ int xen_mpic_get_irq(struct cpu_user_regs *regs)
 
        return mpic_get_one_irq(mpic, regs);
 }
-
-int vector_is_ipi(int vector)
-{
-    BUG_ON(!mpic);
-    return (mpic->ipi_offset <= vector) && (vector < mpic->ipi_offset + 4);
-}
index 4916f1045ce387c08be4436f1ea8559bcab88452..51b55f44fbbf80cdd0581be21eccf9a537bc9272 100644 (file)
@@ -45,7 +45,6 @@ void smp_message_recv(int msg, struct cpu_user_regs *regs);
 void smp_call_function_interrupt(struct cpu_user_regs *regs);
 void smp_event_check_interrupt(void);
 void send_IPI_mask(cpumask_t mask, int vector);
-int vector_is_ipi(int vector);
 
 #undef DEBUG_IPI
 #ifdef DEBUG_IPI